Fix false positive about unused replace
authorAleksey Kladov <aleksey.kladov@gmail.com>
Wed, 29 Mar 2017 09:58:45 +0000 (12:58 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Wed, 29 Mar 2017 09:58:45 +0000 (12:58 +0300)
src/cargo/ops/resolve.rs
tests/overrides.rs

index 03825e13e0c646eaff577c7758e55c049212a89a..9a13ac5c9f1092d4a6f52698fd5f87c1e0f42638 100644 (file)
@@ -49,6 +49,14 @@ pub fn resolve_ws_precisely<'a>(ws: &Workspace<'a>,
 
         add_overrides(&mut registry, ws)?;
 
+        for &(ref replace_spec, ref dep) in ws.root_replace() {
+            if !resolve.iter().any(|r| replace_spec.matches(r) && !dep.matches_id(r)) {
+                ws.config().shell().warn(
+                    format!("package replacement is not used: {}", replace_spec)
+                )?
+            }
+        }
+
         Some(resolve)
     } else {
         None
@@ -69,14 +77,6 @@ pub fn resolve_ws_precisely<'a>(ws: &Workspace<'a>,
                                method, resolve.as_ref(), None,
                                specs)?;
 
-    for &(ref replace_spec, _) in ws.root_replace() {
-        if !resolved_with_overrides.replacements().keys().any(|r| replace_spec.matches(r)) {
-            ws.config().shell().warn(
-                format!("package replacement is not used: {}", replace_spec)
-            )?
-        }
-    }
-
     let packages = get_resolved_packages(&resolved_with_overrides, registry);
 
     Ok((packages, resolved_with_overrides))
index 24d84190535e47cecfebd8c590c9bb00cf3d86f7..0941f774dea45a724effc48e387da807aae35d2e 100644 (file)
@@ -927,6 +927,59 @@ fn overriding_nonexistent_no_spurious() {
 ").with_stdout(""));
 }
 
+#[test]
+fn no_warnings_when_replace_is_used_in_another_workspace_member() {
+    Package::new("foo", "0.1.0").publish();
+    Package::new("bar", "0.1.0").publish();
+
+    let p = project("ws")
+        .file("Cargo.toml", r#"
+            [workspace]
+            members = [ "first_crate", "second_crate"]
+
+            [replace]
+            "foo:0.1.0" = { path = "local_foo" }"#)
+        .file("first_crate/Cargo.toml", r#"
+            [package]
+            name = "first_crate"
+            version = "0.1.0"
+
+            [dependencies]
+            foo = "0.1.0"
+        "#)
+        .file("first_crate/src/lib.rs", "")
+        .file("second_crate/Cargo.toml", r#"
+            [package]
+            name = "second_crate"
+            version = "0.1.0"
+        "#)
+        .file("second_crate/src/lib.rs", "")
+        .file("local_foo/Cargo.toml", r#"
+            [package]
+            name = "foo"
+            version = "0.1.0"
+        "#)
+        .file("local_foo/src/lib.rs", "");
+    p.build();
+
+    assert_that(p.cargo("build").cwd(p.root().join("first_crate")),
+                execs().with_status(0)
+                    .with_stdout("")
+                    .with_stderr("\
+[UPDATING] registry `[..]`
+[COMPILING] foo v0.1.0 ([..])
+[COMPILING] first_crate v0.1.0 ([..])
+[FINISHED] [..]"));
+
+    assert_that(p.cargo("build").cwd(p.root().join("second_crate")),
+                execs().with_status(0)
+                    .with_stdout("")
+                    .with_stderr("\
+[COMPILING] second_crate v0.1.0 ([..])
+[FINISHED] [..]"));
+}
+
+
 #[test]
 fn override_to_path_dep() {
     Package::new("foo", "0.1.0").dep("bar", "0.1").publish();